
#ifndef _IO_INIT_H_
#define _IO_INIT_H_

#include "at32f403a_407_board.h"
#include "at32f403a_407_clock.h"
#include <at32f403a_407_usb.h>

static void _set_gpio_mode(gpio_type*gpio,uint32_t pin_bit,uint32_t mode){
    mode <<= (pin_bit&7)*4;
    uint32_t mode_mask = ~(0b1111 << ((pin_bit & 7) *4) );

    if(pin_bit<8){
        gpio->cfglr = (gpio->cfglr&mode_mask) | mode;
    }
    else{
        gpio->cfghr = (gpio->cfghr&mode_mask) | mode;
    }
}

static void _set_gpio_out(gpio_type*gpio,uint32_t pin_bit){
    uint32_t mode = 0b10;           //适中的输出
    mode |= 0b00 << 2;              //通用推挽
    _set_gpio_mode(gpio,pin_bit,mode);
}



static void _set_gpio_in(gpio_type*gpio,uint32_t pin_bit){
    uint32_t mode = 0b00;           //输入
    mode |= 0b10 << 2;              //浮空
    _set_gpio_mode(gpio,pin_bit,mode);
    gpio->odt &= ~(1<<pin_bit);
}

static void _set_gpio_od(gpio_type*gpio,uint32_t pin_bit){
    uint32_t mode = 0b10;           //适中的输出
    mode |= 0b01 << 2;              //开漏
    _set_gpio_mode(gpio,pin_bit,mode);
}

#endif
